package br.edu.ifrn.dominio;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.edu.ifrn.annotation.OrdenacaoPadrao;
import br.edu.ifrn.dao.AlunoDAO;
import br.edu.ifrn.dao.InstrumentoConclusaoDAO;
import br.edu.ifrn.exception.NegocioException;
import br.edu.ifrn.generic.GenericEntidade;
import br.edu.ifrn.utils.ValidadorCampo;

@NamedQueries({
})
@Entity
@OrdenacaoPadrao(campos="nome")
public class InstrumentoConclusao extends GenericEntidade implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
    @GeneratedValue(strategy=IDENTITY)
	protected Long id;
	
	private String titulo;
	private String descricao;
	private String palavrasChave;
	private boolean finalizado = false;
	
	@ManyToOne
	private TipoInstrumentoConclusao tipoInstrumentoConclusao;
	@OneToOne
	private Aluno aluno;
	@ManyToOne
	private Usuario orientador;

	@Temporal(TemporalType.DATE)
	private Date inicio;
	@Temporal(TemporalType.DATE)
	private Date fim;
	
	
	@Basic(fetch=FetchType.EAGER)
	private byte[] anexoFinal;
	
	@Override
	public void validarImpl(List<String> erros) {
		ValidadorCampo.validarCampoNulo(this.tipoInstrumentoConclusao, "tipo do instrumento de conclusão", erros);
		ValidadorCampo.validarCampoNulo(this.aluno, "aluno", erros);
		ValidadorCampo.validarCampoNulo(this.orientador, "orientador", erros);
		ValidadorCampo.validarCampoVazio(this.titulo, "título", erros);
		ValidadorCampo.validarCampoVazio(this.descricao, "descrição", erros);
		ValidadorCampo.validarCampoVazio(this.palavrasChave, "palavras chave", erros);
		ValidadorCampo.validarCampoNulo(this.inicio, "início", erros);
		ValidadorCampo.validarCampoNulo(this.fim, "fim", erros);
		ValidadorCampo.validarDatas(this.inicio, "início", this.fim, "fim", erros);
		if(this.isFinalizado() && this.anexoFinal == null){
			erros.add("É necessário adicionar o anexo (Relatório, Monografia, etc...) ao finalizar Instrumento.");
		}
		
		try {
			List<InstrumentoConclusao> instrumentos = new InstrumentoConclusaoDAO().consultarTodos(" WHERE instrumentoConclusao.aluno.matricula = '"+this.getAluno().getMatricula()+"' AND instrumentoConclusao.finalizado = false", "");
			if(instrumentos.size()!=0 && !instrumentos.get(0).getId().equals(this.getId())){
				erros.add("Já existe um Instrumento de Conclusão aberto para este aluno");
			}
		} catch (NegocioException e) {
			erros.add("Erro ao validar entidade");
		};
	}
	
	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getPalavrasChave() {
		return palavrasChave;
	}

	public void setPalavrasChave(String palavrasChave) {
		this.palavrasChave = palavrasChave;
	}

	public TipoInstrumentoConclusao getTipoInstrumentoConclusao() {
		return tipoInstrumentoConclusao;
	}

	public void setTipoInstrumentoConclusao(
			TipoInstrumentoConclusao tipoInstrumentoConclusao) {
		this.tipoInstrumentoConclusao = tipoInstrumentoConclusao;
	}

	public Aluno getAluno() {
		return aluno;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

	public Usuario getOrientador() {
		return orientador;
	}

	public void setOrientador(Usuario orientador) {
		this.orientador = orientador;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getFim() {
		return fim;
	}

	public void setFim(Date fim) {
		this.fim = fim;
	}

	public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

	@Override
	public boolean equals(Object object) {
		if(object instanceof InstrumentoConclusao && ((InstrumentoConclusao)object).getId()==this.getId()){
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
	}

	@Override
	public boolean isNewRecord() {
		return (this.id == null || this.id == 0); 
	}

	public void setFinalizado(boolean finalizado) {
		this.finalizado = finalizado;
	}

	public boolean isFinalizado() {
		return finalizado;
	}

	public void setAnexoFinal(byte[] anexoFinal) {
		this.anexoFinal = anexoFinal;
	}

	public byte[] getAnexoFinal() {
		return anexoFinal;
	}
}
